<?php


namespace app\admin\service;


use Firebase\JWT\JWT;
use Firebase\JWT\Key;


class JwtAuth
{

    private $key = '123456798';  //自定义key值

    /**
     * @param $data
     * Desc: 生成签名
     * User: 苏鹏
     * Date: 2023/9/7
     * Time: 11:19
     * @return string
     */
    function signToken($data): string
    {
        $key = $this->key;         //这里是自定义的一个随机字串，应该写在config文件中的，解密时也会用，相当于加密中常用的 盐-salt
        $token = array(
            "iss" => $key,        //签发者 可以为空
            "aud" => '',          //面象的用户，可以为空
            "iat" => time(),      //签发时间
            "nbf" => time() + 3,    //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
            "exp" => time() + 7200, //token 过期时间
            "data" => $data           //记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
        );
        return JWT::encode($token, $key, "HS384");  //根据参数生成了token，可选：HS256、HS384、HS512、RS256、ES256等
    }

    /**
     * @param $token
     * Desc: 验证token
     * User: 苏鹏
     * Date: 2023/9/7
     * Time: 11:19
     * @return array|int[]
     */
    function checkToken($token): array
    {
        if(empty($token)){
            $res['msg'] = msg_code(16); //'token为空，请重新登录！';
            $res['status'] = false;
            $res['code'] = 500;
            return $res;
        }

        $key = $this->key;
        $status = ["status" => false];

        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($token, new Key($key, 'HS384')); //同上的方式，这里要和签发的时候对应
            $arr = (array)$decoded;
            $res['status'] = true;
            $res['msg'] = '';
            $res['code'] = 200;
            $res['data'] = $arr['data'];
            $res['data'] = json_decode(json_encode($res['data']), true); //将stdObj类型转换为array
            return $res;
        } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $status['msg'] = msg_code(17);  //签名不正确
            $status['code'] = 17;
            return $status;
        } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $status['msg'] = msg_code(18);  //token失效
            $status['code'] = 18;
            return $status;
        } catch (\Firebase\JWT\ExpiredException $e) { // token过期
            $status['msg'] = msg_code(18);  //token 失效
            $status['code'] = 18;
            return $status;
        } catch (\Exception $e) { //其他错误
            $status['msg'] = $e->getMessage();
            $status['code'] = 16;
            return $status;
        }
    }

}